package com.jdd.modules.parking.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jdd.modules.parking.entity.ParkCarEnterLog;
import com.jdd.modules.parking.vo.MontiorSearchRespVo;
import com.jdd.modules.parking.vo.MontiorSearchVo;
import com.jdd.modules.sdkidentifyresultpushlog.entity.SdkIdentifyResultPushLog;
import com.jdd.modules.sdkidentifyresultpushlog.entity.vo.MonthlyEnterTypeVo;

import java.util.Date;
import java.util.List;

/**
 * @Description: 车辆入场信息
 * @Author: jdd
 * @Date: 2021-02-20
 * @Version: V1.0
 */
public interface IparkCarEnterLogService extends IService<ParkCarEnterLog> {

    /**
     * 查询停车场的详细入场纪录
     *
     * @return 停车场详细入场纪录
     **/
    List<ParkCarEnterLog> enterLogDetails();

    /**
     * 查询车辆在指定车场最近的一条未出场的入场记录
     *
     * @param parkCode 车场编号
     * @param plateNo  车牌号
     * @param isOut    出场状态
     * @return 车辆最近的一条入场记录
     * @author renshangyi
     * @date 2021-08-17
     */
    ParkCarEnterLog getLastCarEnterLog(String parkCode, String plateNo, String isOut);

    /**
     * 监控页面的入场
     *
     * @param montiorSearchVo
     * @param pageNo
     * @param pageSize
     * @return
     * @throws Exception
     */
    Page<MontiorSearchRespVo> monitorList(MontiorSearchVo montiorSearchVo, Integer pageNo, Integer pageSize) throws Exception;

    /**
     * 查询车辆在指定车场的所有未出场的入场纪录，并根据入场时间，倒序排序
     *
     * @param plateNo 车牌号
     * @param isOut   出入场状态
     * @return 车辆未出场的入场纪录
     * @author liuyaowen
     * @date 2021-08-19
     */
    List<ParkCarEnterLog> getCarEnterLogs(String plateNo, String isOut);

    /**
     * 得到车辆最新一批入场纪录,车牌号不为空时,查询有牌车的入场纪录,车牌号为空时,查询无牌车的入场纪录
     *
     * @param plateNo  车牌号
     * @param parkCode 车场编号
     * @return 入场纪录
     */
    List<ParkCarEnterLog> getParkCarEnterLog(String plateNo, String parkCode);

    /**
     * 更新车辆转区域更新车辆在当前区域的状态
     *
     * @param areaId
     * @param plateNo
     * @return
     */
    boolean updateCarEnterLogThisArea(String areaId, String plateNo);

    /**
     * 查询在本区域内需要转卡的临时车辆信息
     *
     * @param areaId
     * @param plateNo
     * @return
     */
    List<ParkCarEnterLog> getThisAreaCarEnterList(String areaId, List<String> plateNo);

    /**
     * 保存预转卡记录
     *
     * @param parkCarEnterLog
     * @param vo
     * @return
     */
    ParkCarEnterLog saveTransferCardInfo(ParkCarEnterLog parkCarEnterLog, MonthlyEnterTypeVo vo);

    /**
     * 更新预转卡记录
     *
     * @param identifyResultPushLog
     * @param areaId
     * @return
     */
    boolean updateIsTransfer(SdkIdentifyResultPushLog identifyResultPushLog, String areaId);

    /**
     * 无牌车入场识别放入缓存 保留代码
     *
     * @param parkCode
     * @param serialNo
     */
    void sendUnlicensedCarEnter(String parkCode, String serialNo);

    /**
     * 查询指定车场最近的一条未出场的入场记录
     *
     * @param parkCode 车场编号
     * @param isOut    出场状态
     * @return 车辆最近的一条入场记录
     * @author renshangyi
     * @date 2021-08-17
     */
    ParkCarEnterLog getLastCarEnterLogNoPlateNo(String parkCode, String isOut);

    /** 查询车场内所有入场记录根据车牌号分组取最新一条数据 */
    List<ParkCarEnterLog> getNewParkCarEnterLogGroupByPlateNo();

    void updateSynchronousStatus(String id, String synchronousStatus);

    /**
     * 查询车辆未出场的入场记录
     * @param parkCode 车场编号
     * @param plateNo   车牌号
     * @param isOut     出场状态
     * @return  车辆最近的一条入场记录
     * @author renshangyi
     * @date 2021-08-17
     */
    List<ParkCarEnterLog> getIsNotOutCarEnterLog(String parkCode, String plateNo, String isOut);

    /**
     * 获取第一次入场时间
     *
     * @param parkCode
     * @param plateNo
     * @return void
     * @author jdd孙庆伟
     * @date 2022/3/12 14:56:34
     * @version 1.0
     */
    Date getOneEnterTime(String parkCode, String plateNo);

    /**
     * 查询当前区域下，指定车牌号列表内的在场记录
     * @param plateNos 车牌号列表
     * @param areaId 区域id
     * @param parkCode 车场编号
     * @return List<ParkCarEnterLog>
     * */
    List<ParkCarEnterLog> getAreaNoOutCarEnterLog(List<String> plateNos,String areaId,String parkCode);

}
